package com.hongpu.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 张玉胜
 */
@Configuration
@MapperScan("com.hongpu.mapper")
public class MybatisPlusConfig {

    @Autowired
    private MybatisPlusCustomTenantHandler customTenantHandler;




    /**
     * mybatis-plus插件使用配置
     * MybatisPlusInterceptor 有一个关键属性 interceptors，它是一个 List<InnerInterceptor> 类型的集合，用于存储所有要应用的内部拦截器。
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 创建MybatisPlusInterceptor实例
        MybatisPlusInterceptor interceptors = new MybatisPlusInterceptor();


        /*
        * 使用多个插件时，需要注意它们的顺序。建议的顺序是：
        * 多租户、动态表名
        * 分页、乐观锁
        * SQL 性能规范、防止全表更新与删除
        * 总结：对 SQL 进行单次改造的插件应优先放入，不对 SQL 进行改造的插件最后放入。
        * */
        // 添加多租户插件
        TenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor();
        tenantInterceptor.setTenantLineHandler(customTenantHandler);
        interceptors.addInnerInterceptor(tenantInterceptor);

        // 添加分页内部拦截器，指定数据库类型为MySQL
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        interceptors.addInnerInterceptor(paginationInnerInterceptor);
        // 返回配置好的MybatisPlus拦截器
        return interceptors;
    }

}